\documentclass{article}
\usepackage{polski}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color} % For colors and names
\hyphenpenalty=1115000
\title{\textbf{Metody sztucznej inteligencji 12L} \\ Wumpus i wnioskowanie wprzód\\ Dokumentacja projektu} % Title

\author{Tomasz \textsc{Bawej} \\ Łukasz \textsc{Trzaska}} % Author name

\definecolor{mygrey}{gray}{.96} % Light Grey
\lstset{language=Verilog, tabsize=3, backgroundcolor=\color{mygrey}, basicstyle=\small, commentstyle=\color{BrickRed}}
\lstset{ 
	language=[ISO]C++,              % choose the language of the code ("language=Verilog" is popular as well)
   	tabsize=3,							  % sets the size of the tabs in spaces (1 Tab is replaced with 3 spaces)
	basicstyle=\scriptsize,               % the size of the fonts that are used for the code
	numbers=left,                   % where to put the line-numbers
	numberstyle=\scriptsize,              % the size of the fonts that are used for the line-numbers
	stepnumber=2,                   % the step between two line-numbers. If it's 1 each line will be numbered
	numbersep=5pt,                  % how far the line-numbers are from the code
	backgroundcolor=\color{mygrey}, % choose the background color. You must add \usepackage{color}
	%showspaces=false,              % show spaces adding particular underscores
	%showstringspaces=false,        % underline spaces within strings
	%showtabs=false,                % show tabs within strings adding particular underscores
	frame=single,	                 % adds a frame around the code
	captionpos=b,                   % sets the caption-position to bottom
	breaklines=true,                % sets automatic line breaking
	breakatwhitespace=false,        % sets if automatic breaks should only happen at whitespace
	%escapeinside={\%*}{*)},        % if you want to add a comment within your code
	commentstyle=\color{BrickRed}   % sets the comment style
}
\newenvironment{packed_enum}{
\begin{enumerate}
  \setlength{\itemsep}{1pt}
  \setlength{\parskip}{0pt}
  \setlength{\parsep}{0pt}
}{\end{enumerate}}
\begin{document}
\setlength\parindent{0pt} % Removes all indentation from paragraphs
\maketitle
\section{Treść}
\textbf{W1.} Wumpus i wnioskowanie w przód 
Wyrazić w języku logiki wiedzę potrzebną agentowi grającemu w Świat Wumpusa i zaimplementować algorytm wyboru akcji dla tego agenta w oparciu o wnioskowanie wprzód. 
\section{Wybór środowiska implementacji}
Do implementacji wybrano język Java. Początkowo próbowano wykorzystać proponowane biblioteki \textit{aima-java} oraz symulator świata Wumpusa  \textit{holder-javawumpus}. Zrezygnowano jednak z  powodów opisanych poniżej.
\paragraph*{}
Biblioteka aima-java wspiera wnioskowanie wprzód, w postaci wnioskowania tabeli prawdy i tylko dla prostych formuł bez zmiennych. Użycie takiego mechanizmu byłoby wymuszone. Natomiast symulator holder-javawumpus, zawiera mnóstwo błędów implementacyjnych. Na ich naprawienie poświęcono dużo czasu, biblioteka spełaniała pozornie swoją funkcjonalność, do czasu dokładniejszego testowania.
\paragraph*{}
Ostatecznie implementację osadzono w symulatorze świata Wumpusa o nazwie Wumpus-Lite  (\textit{http://www.cs.uic.edu/~jbiagion/wumpuslite.html}), a silnik wnioskowania wprzód, zrealizowano przy użyciu prostej struktury danych w języku Java
\begin{center} {\scriptsize $ private HashMap\langle String, Boolean\rangle knowledge\; $ }
\end{center}
oraz zestawu metod do zapisu i wyciągania wniosków z tej struktury.
\section{Wiedza agenta do gry w świecie wumpusa}
Założenia świata wumpusa:
\begin{packed_enum}
\item Wumpus się nie porusza i jest jeden.
\item Jaskiń \textit{(ang. pits)} jest więcej niż jedna.
\end{packed_enum}
{\scriptsize 
\textbf{Stałe:}\\
$ ROZ\_PLANSZY = N $\\
\\
\textbf{Cele:}\\
$ Posiada\_zloto(Agent, true) \wedge Poza\_plansza(Agent, true) $\\
\\
\textbf{Warunki początkowe:}\\
$ Wumpus\_zywy(true), Bezpieczne(L(1,1)), Posiada\_zloto(Agent, false), Poza\_plansza(Agent, false)$
\\
}
\\
\textbf{Reguły w języku logiki:}
{\scriptsize
\begin{packed_enum}
\item $ Sasiaduje(A(x,y), B(w,z)) \Longleftarrow $
$ Rowne(x,w) \wedge [Rowne(y, z+1) \wedge Rowne(y, z-1)] \vee$  
$ Rowne(y,z) \wedge [Rowne(x, w+1) \wedge Rowne(x, w-1)] $
\item $ Sasiaduje(a, b) \Longleftarrow Sasiaduje(b, a) $
\item $ Sciana(A(x,y)) \Longleftarrow $
$ [ Mniejsze(x,1) \vee Wieksze(x, ROZ\_PLANSZY ) \vee Mniejsze(y,1) \vee Wieksze(y, ROZ\_PLANSZY ) ] $
\item $ Sciana(a) \Longleftarrow [ Bumped(a) ] $
\item $ Na\_zlocie(Agent) \Longleftarrow [ Glittering(L) ] $
\item $ Bezpieczne(L) \Longleftarrow Byl\_na(Agent, L) $
\item $ Bezpieczne(Sasiaduje(L)) \Longleftarrow [ \neg Breezy(L) \wedge \neg Stenchy(L) ] $
\item $ Wumpus\_zywy(false) \Longleftarrow [ Scream(L) ] $
\\
\item $ Moze\_Wumpus(L(x+1,y), L1) \Longleftarrow $ \\ $[ Stenchy(L1(x,y)) \wedge \neg Bezpieczne(L(x+1,y)) \wedge \neg Wumpus(L(x+1,y))] $
\item $ Moze\_Wumpus(L(x-1,y), L1) \Longleftarrow $ \\ $[ Stenchy(L1(x,y)) \wedge \neg Bezpieczne(L(x-1,y)) \wedge \neg Wumpus(L(x-1,y)) ] $
\item $ Moze\_Wumpus(L(x,y+1), L1) \Longleftarrow $ \\ $[ Stenchy(L1(x,y)) \wedge \neg Bezpieczne(L(x,y+1)) \wedge \neg Wumpus(L(x,y+1))] $
\item $ Moze\_Wumpus(L(x,y-1), L1) \Longleftarrow $ \\ $[ Stenchy(L1(x,y)) \wedge \neg Bezpieczne(L(x,y-1)) \wedge \neg Wumpus(L(x,y-1)) ] $
\item $ Wumpus(L) \Longleftarrow [ Moze\_Wumpus(L, x) \wedge Moze\_Wumpus(L, y) \wedge \neg Rowne(x, y) ] $
\\
\item $ Moze\_Pit(L(x+1,y)) \Longleftarrow $ \\ $ [ Breezy(L1(x,y)) \wedge \neg Bezpieczne(L(x+1,y)) \wedge \neg Pit(L(x+1,y)) ] $
\item $ Moze\_Pit(L(x-1,y)) \Longleftarrow $ \\ $ [ Breezy(L1(x,y)) \wedge \neg Bezpieczne(L(x-1,y)) \wedge \neg Pit(L(x-1,y)) ] $
\item $ Moze\_Pit(L(x,y+1)) \Longleftarrow $ \\ $ [ Breezy(L1(x,y)) \wedge \neg Bezpieczne(L(x,y+1)) \wedge \neg Pit(L(x,y+1)) ] $
\item $ Moze\_Pit(L(x,y-1)) \Longleftarrow $ \\ $[ Breezy(L1(x,y)) \wedge \neg Bezpieczne(L(x,y-1)) \wedge \neg Pit(L(x,y-1)) ] $
\item $ Pit(L) \Longleftarrow [ Moze\_Pit(L, x) \wedge Moze\_Pit(L, y) \wedge Moze\_Pit(L, z) \wedge Moze\_Pit(L, w) \wedge \neg Rowne(x, y, z, w) ] $
\end{packed_enum}

\textbf{Algorytm podejmowania akcji przez agenta}\\
Agent zapisuje: 
$ Stenchy(L(x, y)), Breezy(L(x,y)), Bumped(L(x,y)), Glitter(L(x,y)), Scream(L(x,y)) $. 
Po zebraniu kolejnego wektora \textit{percepts} agent wnioskuje na temat wyglądu planszy. Jest ostrożny, porusza się jedynie na pola, co do których wiadomo, że są bezpieczne (fakt: $ Bezpieczne(L(x,y)) $).
Gdy na swojej drodze napotyka Wumpusa i nie użył jeszcze strzały - próbuje go upolować. Główna jego działalność to eksplorowanie planszy. Po napotkaniu złota kieruje się do wyjścia.
}
\section{Instrukcja uruchomienia implementacji}
Wraz z niniejszą dokumentacją dostarczono źródło programu oraz kod wykonywalny w pliku 
\textit{ MSI\_W1\_wumpus.jar}. Aby uruchomić program należy w linii poleceń z lokalizacji w której znajduje się plik \textit{.jar} uruchomić:
\begin{center}
{\scriptsize java -jar MSI\_W1\_wumpus.jar}
\end{center}
\section{Wyniki symulacji}
\textbf{Parametry symulacji:}
Liczba testów: 50 000\\
Rozmiar planszy: 6 na 6\\
\textbf{Uzyskane wyniki:}
Punktów średnio: 552.27\\
Punktów min.: -1008.0\\
Punktów maks.: 999.0
\end{document}